<html lang="zh-CN"><head><meta charset="UTF-8"><style>.nodata  main {width:1000px;margin: auto;}</style></head><body class="nodata " style=""><div class="main_father clearfix d-flex justify-content-center " style="height:100%;"> <div class="container clearfix " id="mainBox"><main><div class="blog-content-box">
<div class="article-header-box">
<div class="article-header">
<div class="article-title-box">
<h1 class="title-article" id="articleContentId">(C卷,100分)- ABR 车路协同场景（Java & JS & Python）</h1>
</div>
</div>
</div>
<div id="blogHuaweiyunAdvert"></div>

        <div id="article_content" class="article_content clearfix">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-044f2cf1dc.css">
                <div id="content_views" class="htmledit_views">
                    <h4 id="main-toc">题目描述</h4> 
<p>数轴×有两个点的序列 A&#61;{A1&#xff0c; A2, …, Am}和 B&#61;{B1, B2, ..., Bn}&#xff0c; Ai 和 Bj 均为正整数&#xff0c; A、 B 已经从小到大排好序&#xff0c; A、 B 均肯定不为空&#xff0c;</p> 
<p>给定一个距离 R&#xff08;正整数&#xff09;&#xff0c;列出同时满足如下条件的所有&#xff08;Ai&#xff0c; Bj&#xff09;数对</p> 
<p><strong>条件&#xff1a;</strong></p> 
<ol><li>Ai &lt;&#61; Bj</li><li>Ai,Bj 距离小于等于 R&#xff0c;但如果 Ai 找不到 R 范围内的 Bj&#xff0c;则列出距它最近的 1 个 Bj&#xff0c;当然此种情况仍然要满足 1&#xff0c;</li></ol> 
<p>但如果仍然找不到&#xff0c;就丢弃 Ai。</p> 
<p><strong>原型&#xff1a;</strong></p> 
<p>车路协同场景&#xff0c;一条路上发生了有很多事件&#xff08; A&#xff09;&#xff0c;要通过很多路测设备&#xff08; B&#xff09;广播给路上的车&#xff0c;需要给每个事件找到一个合适的路测设备去发送广播消息。</p> 
<p></p> 
<h4 id="%E8%BE%93%E5%85%A5%E6%8F%8F%E8%BF%B0">输入描述</h4> 
<p>按照<strong>人易读</strong>的格式输入一行数据&#xff0c;参见输入样例&#xff0c;其中“ ABR&#61;{&#xff0c; }”中的每个字符都是关键分割符&#xff0c;输入中无空格&#xff0c;其他均为任意正整数&#xff0c;</p> 
<p>输入 A 和 B 已经排好序&#xff0c; A 和 B 的大小不超过 50&#xff0c;正整数范围不会超过 65535。</p> 
<p></p> 
<h4 id="%E8%BE%93%E5%87%BA%E6%8F%8F%E8%BF%B0">输出描述z</h4> 
<p>&#xff08; Ai,Bj&#xff09;数对序列&#xff0c;排列顺序满足序列中前面的 Ax&lt;&#61;后面的 Ay&#xff0c;前面的 Bx&lt;&#61;后面的 By&#xff0c;</p> 
<p>因为输入 A 和 B 已经排好序&#xff0c;所以实际上输出结果不用特意排序&#xff0c;排序不是考察点。</p> 
<p></p> 
<h4 id="%E7%94%A8%E4%BE%8B">用例</h4> 
<table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><tbody><tr><td style="width:86px;">输入</td><td style="width:412px;">A&#61;{1,3,5},B&#61;{2,4,6},R&#61;1</td></tr><tr><td style="width:86px;">输出</td><td style="width:412px;">(1,2)(3,4)(5,6)</td></tr><tr><td style="width:86px;">说明</td><td style="width:412px;">无</td></tr></tbody></table> 
<p></p> 
<h4 id="%E9%A2%98%E7%9B%AE%E8%A7%A3%E6%9E%90">题目解析</h4> 
<p>首先&#xff0c;输入中有效数据的获取&#xff0c;我使用了正则</p> 
<p>const regExp &#61; /A\&#61;\{<!-- --><span style="color:#fe2c24;">(.&#43;)</span>\}\,B\&#61;\{<!-- --><span style="color:#fe2c24;">(.&#43;)</span>\}\,R\&#61;<span style="color:#fe2c24;">(.&#43;)</span>/;</p> 
<p>其中有三个捕获组&#xff0c;分别捕获出1,3,5和2,4,6以及1</p> 
<p><img alt="" height="158" src="https://img-blog.csdnimg.cn/b72a4dd84b9d4d6dae5d4ef1d7a057ce.png" width="919" /></p> 
<p>然后我们就可以通过一些简单的字符串操作得到A,B,R数据了。 </p> 
<p></p> 
<p>得到A、B、R后&#xff0c;我们只要双重for&#xff0c;外层遍历A&#xff0c;内层遍历B&#xff0c;然后找满足A[i] &#43; R &#61; B[j]的数据&#xff0c;当然在找的过程中&#xff0c;需要记录第一个比A[i]大的B[j1]&#xff0c;因为要防止找不到满足A[i] &#43; R &#61; B[j]的数据时&#xff0c;可以输出一个和A[i]最近的B[j1]</p> 
<blockquote> 
 <p>Ai,Bj 距离小于等于 R&#xff0c;但如果 Ai 找不到 R 范围内的 Bj&#xff0c;则列出<span style="color:#fe2c24;">距它最近的 1 个 Bj</span>&#xff0c;当然此种情况仍然要满足 1&#xff0c;</p> 
</blockquote> 
<hr /> 
<p>2023.06.22</p> 
<p>根据考友提示&#xff0c;本题要返回的  (Ai,Bj)  数对需要满足下面条件</p> 
<ol><li>Ai &lt;&#61; Bj</li><li>Ai,Bj 距离小于等于 R&#xff0c;但如果 Ai 找不到 R 范围内的 Bj&#xff0c;则列出距它最近的 1 个 Bj&#xff0c;当然此种情况仍然要满足 1</li></ol> 
<p>关于其中第2个条件</p> 
<ul><li>如果对于Ai&#xff0c;存在多个Bj&#xff0c;使其满足Ai &lt;&#61; Bj 且 Bj - Ai &lt;&#61; R&#xff0c;则应该全部输出。</li><li>如果对于Ai&#xff0c;不存在Bj 满足Ai &lt;&#61; Bj 且 Bj - Ai &lt;&#61; R&#xff0c;则应该进一步检查是否存在Bj &gt; Ai&#xff0c;如果存在&#xff0c;则输出这些Bj中最小的那个和Ai组成的数对。</li></ul> 
<p></p> 
<h4 id="%E7%AE%97%E6%B3%95%E6%BA%90%E7%A0%81">JavaScript算法源码</h4> 
<pre><code class="language-javascript">/* JavaScript Node ACM模式 控制台输入获取 */
const readline &#61; require(&#34;readline&#34;);

const rl &#61; readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on(&#34;line&#34;, (line) &#61;&gt; {
  const regExp &#61; /A\&#61;\{(.&#43;)\}\,B\&#61;\{(.&#43;)\}\,R\&#61;(.&#43;)/;

  let [_, A, B, R] &#61; regExp.exec(line);

  A &#61; A.split(&#34;,&#34;).map(Number);
  B &#61; B.split(&#34;,&#34;).map(Number);
  R &#61; parseInt(R);

  console.log(getResult(A, B, R));
});

function getResult(A, B, R) {
  const ans &#61; [];

  for (let a of A) {
    let cnt &#61; 0;
    for (let b of B) {
      if (b &lt; a) continue;

      if (b - a &lt;&#61; R || cnt &#61;&#61; 0) {
        ans.push(&#96;(${a},${b})&#96;);
        cnt&#43;&#43;;
      } else {
        break;
      }
    }
  }

  return ans.join(&#34;&#34;);
}
</code></pre> 
<p></p> 
<h4>Java算法源码</h4> 
<pre><code class="language-java">import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    Scanner sc &#61; new Scanner(System.in);

    String s &#61; sc.nextLine();
    Matcher m &#61; Pattern.compile(&#34;A&#61;\\{(.&#43;)},B&#61;\\{(.&#43;)},R&#61;(.&#43;)&#34;).matcher(s);

    if (m.matches()) {
      int[] A &#61; Arrays.stream(m.group(1).split(&#34;,&#34;)).mapToInt(Integer::parseInt).toArray();
      int[] B &#61; Arrays.stream(m.group(2).split(&#34;,&#34;)).mapToInt(Integer::parseInt).toArray();
      Integer R &#61; Integer.parseInt(m.group(3));
      System.out.println(getResult(A, B, R));
    }
  }

  public static String getResult(int[] A, int[] B, Integer R) {
    StringBuilder sb &#61; new StringBuilder();

    for (int a : A) {
      int cnt &#61; 0;
      for (int b : B) {
        if (b &lt; a) continue;
        if (b - a &lt;&#61; R || cnt &#61;&#61; 0) {
          sb.append(&#34;(&#34;).append(a).append(&#34;,&#34;).append(b).append(&#34;)&#34;);
          cnt&#43;&#43;;
        } else {
          break;
        }
      }
    }

    return sb.toString();
  }
}
</code></pre> 
<p></p> 
<h4>Python算法源码</h4> 
<pre><code class="language-python">import re

# 输入获取
s &#61; input()
tmp &#61; re.compile(r&#34;A&#61;\{(.&#43;)},B&#61;\{(.&#43;)},R&#61;(.&#43;)&#34;).search(s)
A &#61; list(map(int, tmp.group(1).split(&#34;,&#34;)))
B &#61; list(map(int, tmp.group(2).split(&#34;,&#34;)))
R &#61; int(tmp.group(3))


# 算法入口
def getResult():
    ans &#61; []

    for a in A:
        cnt &#61; 0
        for b in B:
            if b &lt; a:
                continue

            if b - a &lt;&#61; R or cnt &#61;&#61; 0:
                ans.append(f&#34;({a},{b})&#34;)
                cnt &#43;&#61; 1
            else:
                break

    return &#34;&#34;.join(ans)


# 算法调用
print(getResult())
</code></pre>
                </div>
        </div>
        <div id="treeSkill"></div>
        <div id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"></div>
    <script>
  $(function() {
    setTimeout(function () {
      var mathcodeList = document.querySelectorAll('.htmledit_views img.mathcode');
      if (mathcodeList.length > 0) {
        for (let i = 0; i < mathcodeList.length; i++) {
          if (mathcodeList[i].naturalWidth === 0 || mathcodeList[i].naturalHeight === 0) {
            var alt = mathcodeList[i].alt;
            alt = '\\(' + alt + '\\)';
            var curSpan = $('<span class="img-codecogs"></span>');
            curSpan.text(alt);
            $(mathcodeList[i]).before(curSpan);
            $(mathcodeList[i]).remove();
          }
        }
        MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
      }
    }, 1000)
  });
</script>
</div></html>